package models;

public class Ewaluator {
    private Uklad [] uklad;
    private Handy [] hand;
    private int iloscGraczy;
    
    public boolean czyPoker(int indeksGracza){
        if(czyKolor(indeksGracza) && czyStrit(indeksGracza)){
            return true;
        }
        return false;
    }
    
    public boolean czyKareta(int indeksGracza){
        Handy reka = hand[indeksGracza];
        if(reka.getCard(0).getWartosc() == reka.getCard(3).getWartosc()
            || reka.getCard(1).getWartosc() == reka.getCard(4).getWartosc()){
                return true;
            }
        return false;
    }
    
    public boolean czyFul(int indeksGracza){
        Handy reka = hand[indeksGracza];
        if((reka.getCard(0).getWartosc() == reka.getCard(2).getWartosc() 
                && reka.getCard(3).getWartosc() == reka.getCard(4).getWartosc())
            || (reka.getCard(2).getWartosc() == reka.getCard(4).getWartosc() 
                && reka.getCard(0).getWartosc() == reka.getCard(1).getWartosc())){
            return true;
        }
        return false;
    }
    
    public boolean czyKolor(int indeksGracza){
        Handy reka = hand[indeksGracza];
        if(reka.getCard(0).getKolor().equals(reka.getCard(1).getKolor())
                && reka.getCard(0).getKolor().equals(reka.getCard(2).getKolor())
                && reka.getCard(0).getKolor().equals(reka.getCard(3).getKolor())
                && reka.getCard(0).getKolor().equals(reka.getCard(4).getKolor())
                ){
            return true;
        }
        return false;
    }
    
    public boolean czyStrit(int indeksGracza){
        Handy reka = hand[indeksGracza];
        if(reka.getCard(0).getWartosc() == reka.getCard(1).getWartosc() - 1
                && reka.getCard(0).getWartosc() == reka.getCard(2).getWartosc() - 2
                && reka.getCard(0).getWartosc() == reka.getCard(3).getWartosc() -3
                && reka.getCard(0).getWartosc() == reka.getCard(4).getWartosc() - 4){
            return true;
            
        }
        return false;
    }
    
    public boolean czyTrojka(int indeksGracza)
    {
        Handy reka = hand[indeksGracza];
        if(reka.getCard(0).getWartosc() == reka.getCard(2).getWartosc()
                || reka.getCard(2).getWartosc() == reka.getCard(4).getWartosc()){
            return true;
        }
        return false;
    }
    
    public boolean czyDwiePary(int indeksGracza){
        Handy reka = hand[indeksGracza];
        if((reka.getCard(0).getWartosc() == reka.getCard(1).getWartosc()
                && (reka.getCard(2).getWartosc() == reka.getCard(3).getWartosc()
                    || reka.getCard(3).getWartosc() == reka.getCard(4).getWartosc())
                    )
                || (reka.getCard(1).getWartosc() == reka.getCard(2).getWartosc() 
                && reka.getCard(3).getWartosc() == reka.getCard(4).getWartosc())){
            return true;
        }
        return false;
    }
    
    public boolean czyPara(int indeksGracza){
        Handy reka = hand[indeksGracza];
        if(reka.getCard(0).getWartosc() == reka.getCard(1).getWartosc()
                || reka.getCard(1).getWartosc() == reka.getCard(2).getWartosc()
                || reka.getCard(2).getWartosc() == reka.getCard(3).getWartosc()
                || reka.getCard(3).getWartosc() == reka.getCard(4).getWartosc()){
            return true;
        }
        return false;
    }
    
    public Uklad sprawdzUklad(int indeksGracza){
        if(czyPoker(indeksGracza)){
            return new Uklad("poker", 1);
        }
        if(czyKareta(indeksGracza)){
            return new Uklad("kareta", 2);
        }
        if(czyFul(indeksGracza)){
            return new Uklad("ful", 3);
        }
        if(czyKolor(indeksGracza)){
            return new Uklad("kolor", 4);
        }
        if(czyStrit(indeksGracza)){
            return new Uklad("strit", 5);
        }
        if(czyTrojka(indeksGracza)){
            return new Uklad("trojka", 6);
        }
        if(czyDwiePary(indeksGracza)){
            return new Uklad("dwie pary", 7);
        }
        if(czyPara(indeksGracza)){
            return new Uklad("para", 8);
        }
        return new Uklad("najwyzsza", 9);
    }
    
    public Ewaluator(Handy [] hand, int iloscGraczy){
        this.hand = hand;
        this.iloscGraczy = iloscGraczy;
        uklad = new Uklad[iloscGraczy];
        
        for(int i = 0; i < iloscGraczy; ++i){
            if(hand[i] != null){
                uklad[i] = sprawdzUklad(i);
            }
        }
    }

    
    public void wypiszUklady(){
        for(int i = 0; i < iloscGraczy; ++i){
            if(hand[i] != null){
                System.out.print("Gracz " + Integer.toString(i + 1));
                System.out.print(" ma " + uklad[i].getNazwa());
                System.out.print(" z kartami: ");
                hand[i].show();
                System.out.println();
            }
        }
    }
    
    private Uklad najlepszyUklad(){
        Uklad najlepszy = new Uklad("najwyzsza", 9);
        for(int i = 0; i < iloscGraczy; ++i){
            if(uklad[i] != null && uklad[i].getWartoscUkladu() < najlepszy.getWartoscUkladu()){
                najlepszy = uklad[i];
            }
        }
        return najlepszy;
    }
    
    public boolean [] wygraniGracze(){
        boolean [] powtorzeni = new boolean [iloscGraczy];
        
        Uklad najlepszyUklad = najlepszyUklad();
        for(int i = 0; i < iloscGraczy; ++i){
            if(uklad[i] != null && uklad[i].getWartoscUkladu() == najlepszyUklad.getWartoscUkladu()){
                powtorzeni[i] = true;
            }
        }
        
        return powtorzeni;
    }
}
